CloudFrontのキャッシュを定期的に自動削除してみた
こんにちは、コンサル部@大阪オフィスのTodaです。
Amazon CloudFrontをご利用頂く中で、オリジン側のコンテンツ内容変更にともないキャッシュをクリアしたいというご要望がございます。
AWS マネジメントコンソールを使う場合、対象のCloudFront内の「キャッシュ削除」で対応可能ですが、
毎週決まった時間にキャッシュ削除をする場合、定期処理で自動削除できるようにしたいと考えました。
今回は、Lambda処理を利用して自動削除出来るようにしてみます。
実現する事
- 毎週決まった時間に指定のCloudFrontのキャッシュをクリアする
- クリアの範囲は「/*」にて全てを指定
試してみる
Lambda関数作成
Python 3.9にてLambda関数を作成します。
プログラムのコードは下記内容になります。
import os import boto3 import time def lambda_handler(event, context): cloudfront = boto3.client('cloudfront') invalidation = cloudfront.create_invalidation(DistributionId=os.environ['DistributionId'], InvalidationBatch={ 'Paths': { 'Items': ['/*'], 'Quantity': 1 }, 'CallerReference': str(time.time()) })
対象のCloudFront指定は環境変数で指定するようにします。
タブメニューから[設定]を選択いただき、左メニューから[環境変数] > [編集]をクリックします。
「DistributionId」のキーにてCloudFrontのIDを指定して保存をおこないます。
IAMロールの設定変更
CloudFrontのキャッシュクリアをする場合、IAMロールの調整が必要になります。
現在設定されているIAMロールに権限を追加します。
タブメニューから[設定]を選択いただき、左メニューから[アクセス権限] > [ロール名]をクリックします。
IAMロールの詳細画面にて[許可を追加] > [ポリシーをアタッチ]をクリックします。
ポリシーが一覧で表示されますので「CloudFront」で検索をおこない、[CloudFrontFullAccess]をアタッチするようにします。
選択後は画面下の[ポリシーのアタッチ]にて設定を完了します。
動作確認
IAMロールが設定出来た時点で、Lambdaのテスト処理にて動作が出来るかの確認をします。
テストイベントでは特に引数を渡す必要もございませんので「hello-world」のテンプレートを利用して実行をします。
実行をおこないCloudFront側でキャッシュ削除がおこなわれていることを確認します。
トリガー設定
テスト処理が正常に出来ていることを確認したらトリガーを設定して定期実行できるように設定します。
関数の概要に表示されている[トリガーを追加]をクリックします。
EventBridgeを選択してルール名とスケジュールを指定します。
今回「Cron形式」にて設定をしていますが、指定はUTC時刻となるため日本時間から-9:00した時刻を指定します。
例: 毎週月曜日のAM6:00の場合「cron(0 21 ? * SUN *)」となります。
トリガーの追加を完了します。
上記にて、定期処理の設定が完了いたしましたので、定期処理の実行されるタイミングにてCloudFront側でキャッシュ削除が出来ていることを確認します。
さいごに
今回はCloudFrontのキャッシュを自動削除する処理をLambdaで実装してみました。
Lambdaで処理を作成していますのでトリガーを変えることでオリジンのファイルが置き換わったときにキャッシュをクリアするなど処理を作る事も可能になります。
少しでもお客様の参考になればと考えております。